<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1.JS延迟加载的方式有哪些？（5）
        用defer属性
        将script放body最后面
        // 2.前端 JavaScript 中的 ECMAScript、DOM、BOM 的含义；
        ECMAScript-- --是ECMA组织制定的一套标准， JavaScript的核心， 规定了js的语法规范

        DOM-- --是document Object model文档对象模型(提供于网页内容交互的方法和接口)

        BOM-- --是brower Object moedl浏览器对象模型(提供与浏览器交互的方法和接口)

        // 3.JavaScript 的数据类型有哪些？
        简单数据类型(String, Number, Boolean, Undefined, Null, Symbol)
        引用数据类型(Object, Array, Function)

        // 4.如何进行数据类型的判断？
        instanceof
        typeof
        Object.prototype.toString.call()

        // 5.null 和 undefined 的区别？什么时候会得到 undefined？
        null--表示已声明但未赋值， 空值
        undefined--表示空的对象， 空的对象指针

        // 6.如何理解 null == undefined 返回 true，null === undefined 返回 false？
        null == undefined 判断值， 两者都是空值
        null === undefined 判断值和数据类型 ==
            表示值相等 ===
            表示全等， 数据类型和值都需要相等

        // 7.使用 continue 或 break 终止循环时，两种方式的区别是？
        continue是中断当前循环， 进入下一次循环
        break终止整个循环

        // 8.如何判断字符串内是否包含指定字符？
        indexOf()
        lastIndexOf()
        includes()

        // 9.请尽量列举出数组的方法，并且注明哪些方法会修改原数组，哪些不会；
        会修改原数组的数组方法： splice, reverse, fill, sort, push, pop, unshift, shift

        不会修改原数组的数组方法： slice, map, forEach, every, some, filter, reduce, entries, find, concat

        // 10. var、let、const 区别？
        var是全局变量， 会存在变量提升
        let是局本变量， 只能在块级作用域访问， 不能跨块访问， 也不能跨函数访问
        const用来定义常量， 使用时必须初始化(即必须赋值)， 只能在块作用域里访问， 而且不能修改

        // 12. 如何在 DOM2 级事件绑定上传递参数？
        addEventListener("eventType", callback, use - capture);

        document.getElementById("outerDiv").addEventListener("click", function() {
            //执行语句
        }); //匿名函数方式

        // 13. 怎么阻止事件的进一步传播和默认事件？
        使用event.stopPropagation() 起到阻止捕获和冒泡阶段中当前事件的进一步传播。
        使用event.preventDefault() 可以取消默认事件。

        // 14. 如何添加一个一次性事件？
        可使用arguments的callee属性配合removeEventListener方法实现事件的移除

        // 15. 同步和异步的区别?
        同步：

        同步的思想是： 所有的操作都做完， 才返回给用户。 这样用户在线等待的时间太长， 给用户一种卡死了的感觉（ 就是系统迁移中， 点击了迁移， 界面就不动了， 但是程序还在执行， 卡死了的感觉）。 这种情况下， 用户不能关闭界面， 如果关闭了， 即迁移程序就中断了。

        异步：

        将用户请求放入消息队列， 并反馈给用户， 系统迁移程序已经启动， 你可以关闭浏览器了。 然后程序再慢慢地去写入数据库去。 这就是异步。 但是用户没有卡死的感觉， 会告诉你， 你的请求系统已经响应了。 你可以关闭界面了。
        // 16. AJAX是什么？AJAX是如何为页面注入灵魂？
        AJAX全称为“ Asynchronous JavaScript and XML”（ 异步JavaScript和XML）， 是一种创建交互式网页应用的网页开发技术

        Ajax其核心有JavaScript、 XMLHTTPRequest、 DOM对象组成， 通过XmlHttpRequest对象来向服务器发异步请求， 从服务器获得数据， 然后用JavaScript来操作DOM而更新页面。 这其中最关键的一步就是从服务器获得请求数据。 Ajax的一个最大的特点是无需刷新页面便可向服务器传输或读写数据(又称无刷新更新页面)

        // 17. 开发阶段的 AJAX 跨域有哪些解决方法，jsonp 的原理是什么
        //(1)后端如何解决跨域问题
        //由后端设置响应头Response Header，即设置白名单，可访问
        //"Access-Control-Allow-Origin":"指定的域名地址" || *

        //(2)前端如何解决跨域问题
        //(2-1)jsonp
        //原理：利用script的src属性，不考虑跨域问题。它不会受同源影响。
        //(2-2)正向代理和反向代理
        //原理：服务器直接的访问，是不存在跨域问题的
        //方法：建立自己的服务器，向别的服务器发送请求，获取数据后，再返回给自己

        // 18. 请描述一下cookies，sessionStorage和localStorage的区别
        （ 1）.存储大小

        cookie数据大小不能超过4k。

        sessionStorage和localStorage 虽然也有存储大小的限制， 但比cookie大得多， 可以达到5M或更大。

        （ 2）.有效时间

        localStorage 存储持久数据， 浏览器关闭后数据不丢失除非主动删除数据；

        sessionStorage 数据在当前浏览器窗口关闭后自动删除。

        cookie 设置的cookie过期时间之前一直有效， 即使窗口或浏览器关闭

        （ 3）.数据与服务器之间的交互方式

        cookie的数据会自动的传递到服务器， 服务器端也可以写cookie到客户端
        // 19. 讲一下常见的异步场景，以及传统异步的诟病和解决方案
        使用场景网络请求， 如 ajax请求、 图片加载
        // 20. 数组如何实现去重？请提供至少2种方法

        //给传入数组排序，排序后相同值相邻，然后遍历时,新数组只加入不与前一值重复的值。
        //function uniq(array){
        //     array.sort();
        //     var temp=[array[0]];
        //     for(var i = 1; i < array.length; i++){
        //         if( array[i] !== temp[temp.length-1]){
        //             temp.push(array[i]);
        //         }
        //     }
        //     return temp;
        // }

        // var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
        // console.log(uniq(aa));
        // 21. 讲一下对基本数据类型 和 复杂/引用数据类型的理解？
        // 22. this 的指向如何确定？
        this 的指向， 是在函数被调用的时候确定的， 在函数执行过程中， this 一旦被确定， 就不可更改了， 在一个函数上下文中， this 由调用者提供， 由调用函数的方式来决定。
        // 23. 谈谈对垃圾回收机制的认识
        垃圾回收机制的是内存
        // 24. 什么是回流重绘，如何进行优化？
        //回流：当render tree的一部分或者全部元素因改变了自身的宽高，布局，显示或隐藏，或元素内部的文字结构发生变化，导致需要重新构建页面的时候，回流就产生了。
        // 重绘：当一个元素自身的宽高，布局，及显示或隐藏没有改变，而只是改变了元素的外观风格的时候，就产生了重绘。
        // 结论：回流必定触发重绘，而重绘不一定出发回流。
        // 如何避免回流：1、不使用能够触发回流的属性；2、建立一个图层，让回流在图层里面进行，限制回流和重绘的范围，减少浏览器的运算工作量。
        // 25. 请解释什么是事件代理
        //事件代理（Event Delegation），又称之为事件委托。是 JavaScript 中常用绑定事件的常用技巧。顾名思义，“事件代理”即是把原本需要绑定的事件委托给父元素，让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡
        // 26. 谈谈你对渐进增强和优雅降级的理解(补充)
    </script>
</body>

</html>